package com.ainge.easystudy.designpattern.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Objects;

/**
 * Cglib实现的动态代理
 *
 * @author: Ainge
 * @Time: 2021/4/24 17:30
 */
public class CglibProxy implements MethodInterceptor {


    public Object CglibProxy(Object target){
        Objects.requireNonNull(target);
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    /**
     * CGLib代理执行代理方法的效率之所以比JDK的高,是因为CGlib采用了FastClass机制
     * 它的原理简单来说就是：为代理类和被代理类各生成一个类，这个类会为代理类或被代理类的方法
     * 分配一个 index (int 类型 ） ；这个 index 当作一个入参 ， FastClass 就可以直接定位要调用 的方法井
     * 直接进行调用，省去了反射调用，所以调用 效率 比 JDK 代理通过反射调用高。
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        long currentTime = before();
        Object invoke = methodProxy.invoke(o, objects);
        after(currentTime);
        return invoke;
    }


    private long before(){
        System.out.println("方法执行开始计时...");
        return System.currentTimeMillis();
    }
    private void after(long currentTime){
        System.out.println("方法执行结束耗时：" + (System.currentTimeMillis() - currentTime) + " ms");
    }
}
